#ifndef _ANALYST_HPP_
#define _ANALYST_HPP_

#include <map>
#include <string>
#include <fstream>
#include <stdint.h>

// 词法分析文件头

const int TOKEN_STR_MAXLEN = 40;

//　所有的记号的类型
enum {
  //  --图元的定义记号
  PRIMITIVE_POINT=0,     // 对应串：point
  PRIMITIVE_LINE,        // 对应串：line
  PRIMITIVE_POLYLINE,    // 对应串：pline
  PRIMITIVE_REGION,      // 对应串：region
  PRIMITIVE_ARC,         // 对应串：arc
  PRIMITIVE_TEXT,        // 对应串：text
  PRIMITIVE_RECT,        // 对应串：rect
  PRIMITIVE_ROUNDRECT,   // 对应串：roundrect
  PRIMITIVE_ELLIPSE,     // 对应串：ellipse
  
  // --关键字
  KEYWORD_SYMBOL,        // 对应串：symbol
  KEYWORD_PEN,           // 对应串：pen
  KEYWORD_MULTIPLE,      // 对应串：multiple
  KEYWORD_SMOOTH,        // 对应串：smooth
  KEYWORD_BRUSH,         // 对应串：brush
  KEYWORD_CENTER,        // 对应串：center
  KEYWORD_FONT,          // 对应串：font
  KEYWORD_SPACING,       // 对应串：spacing
  KEYWORD_JUSTIFY,       // 对应串：jusitfy
  KEYWORD_LEFT,          // 对应串：left
  KEYWORD_RIGHT,         // 对应串：right
  KEYWORD_ANGLE,         // 对应串：angle
  KEYWORD_LABEL,         // 对应串：label
  KEYWORD_SIMPLE,        // 对应串：simple
  KEYWORD_ARROW,         // 对应串：arrow
  
  // --数值
  INTEGER_VALUE,
  NUMERAL_VALUE,
  
  // --错误值
  INVALID_TYPE
};

const int PRIMITIVE_MAXTYPE = PRIMITIVE_ELLIPSE;

struct Token
{
  uint8_t   token_type;                    //记号类型
  union {
    int     ivalue;
    float   fvalue;
  }         value;                         // 记号字面对应的值
	
  Token( void );
  Token( int _type );
};

class Analyst
{
public:
  Analyst( void );
	
  Token get_token( std::ifstream& );
private:
  std::map< std::string, Token >  static_token;
};

#endif						\
